package pri.zjy.linkedList;

import pri.zjy.linkedList.model.ListNode;

/**
 * @author zhangjy
 * @description 两数相加
 * @date 2025/5/13 16:06
 */
public class AddTwoNumbers_2 {

    public static void main(String[] args) {

    }

    /**
     * 个解；
     * <p>
     * 分析：
     * 1.某个链表处理完，节点值就当作0处理；
     * 2.新节点值val >= 10，那么下一个节点要进位；
     * 3.最后一个节点进位后，要特殊处理，再创建一个节点。
     */
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode cur1 = l1, cur2 = l2;
        ListNode head = new ListNode(0, null);
        ListNode prev = head, cur;
        // 进位标识
        int count = 0;
        while (cur1 != null || cur2 != null) {
            // 创建新节点
            int cur1Val = 0, cur2Val = 0, val = 0;
            if (cur1 != null && cur2 != null) {
                cur1Val = cur1.val;
                cur2Val = cur2.val;
            } else if (cur1 != null) {
                cur1Val = cur1.val;
            } else {
                cur2Val = cur2.val;
            }
            val = cur1Val + cur2Val + count;
            if (val >= 10) {
                val = val % 10;
                // 表示下一个节点要进位
                count = 1;
            } else {
                count = 0;
            }
            cur = new ListNode(val);
            // cur1、cur2非空后移
            if (cur1 != null) {
                cur1 = cur1.next;
            }
            if (cur2 != null) {
                cur2 = cur2.next;
            }

            // prev后移
            prev.next = cur;
            prev = cur;
        }
        // 最后一个节点进位，特殊处理
        if (count == 1) {
            cur = new ListNode(count);
            prev.next = cur;
        }
        return head.next;
    }

}
